/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package vistaprincipal;

/**
 *
 * @author kerife
 */
class Tabla {
    char Eatom[];
 	int atom[][];
	char Etv[];
	char tv[][];
	String cadena;
	double respuesta [];
	

	public static Tabla Crear (String cadena,String lista,String traduc)
    {
		Tabla T=new Tabla();
		T.Eatom=Operaciones.ordena(lista.toCharArray());
		T.Etv=traduc.toCharArray();
		T.atom = new int [T.Eatom.length][(int)Math.pow(2,T.Eatom.length)];
		T.tv = new char [T.Etv.length][(int)Math.pow(2,T.Eatom.length)];
		T.cadena=cadena;
		T.respuesta= new double [(int)Math.pow(2,T.Eatom.length)];
		//System.out.println("alto"+T.tv.length+"ancho"+T.tv[0].length);		 imprime el ancho y largo de la cadena
		return T;
    }//crear
	public static Tabla llenado (Tabla T)
	   {		
		int k1=0 ,n=T.Eatom.length ;
		double x=Math.pow(2,n),z=0;
		int x1 = (int) x; //CONVERTIMOS A ENTERO X
		
		for(int i=0;i<n;i++)
		  {
		   z=Math.pow(2,i);
		   k1=0;
			for(int k=0;k<x1;k++)
		      {
		    	if(k1<z)
		    	  {
		    		T.atom[n-i-1][k]=1;	
		    	  }
		    	else
		    	  {
		    		if(k1==2*z-1)
		    		{
		    			T.atom[n-i-1][k]=0;
		    			k1=-1;
		    		}
		    		else
		    			T.atom[n-i-1][k]=0;	
		    	  }
		    	k1++;	  
		      }
		  }
		//------TERMINA EL LLENADO------
		int L=T.Etv.length;  //llenado de las atom en tv
		for(int i=0;i<L;i++)
		  {
			for(int j=0;j<x1;j++)
			 {
				T.tv[i][j]=T.Etv[i];
			 }
			
			for(int k=0;k<n;k++)
			 {
				if(T.Etv[i]==T.Eatom[k])
				 {
					for(int j=0;j<x1;j++)
					 {
						T.tv[i][j]=(char)(T.atom[k][j]+48);
					 }
			     }
			 }
		  }
		return T;
	   }//fin de metodo
	
	public String Imprimir(Tabla T)
      { 
	String aux="";	
          //Imprimiendo encabezado
		for(int i=0;i<T.Eatom.length;i++)
		aux+=T.Eatom[i]+"";
                aux+="|RESPUESTA\n";
		double x1=Math.pow(2,T.Eatom.length);
		for (int k=0;k<x1;k++)
		    {
		      for(int i=0;i<T.Eatom.length;i++)//imprime la parte de las atomicas
			{	
			  if(T.atom[i][k]==1)
			     aux+="T";
			  else
			     aux+="F";
					//System.out.printf("%d",T.atom[i][k]);
			}
				aux+="|";
				//for(int i=0;i<T.Etv.length;i++)//imprime la tabla de verdad
				//	System.out.printf("%c",T.tv[i][k]);
				if(T.respuesta[k]==1.0)
					aux+="  T\n";
				else
					if(T.respuesta[k]==0.0)
					  aux+="  F\n";
					else
				          aux+="ERROR\n";
		    }
             
	return aux;
      }//Imprimir
}
